package com.vb.utils;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.PutObjectRequest;
import com.baidu.aip.imagesearch.AipImageSearch;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.vb.entity.SearchResult;
import org.json.JSONObject;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.web.multipart.MultipartFile;
import sun.misc.BASE64Decoder;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;

import static com.vb.utils.JsonParseResult.getListResult;


@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class SearchUtil {
    //设置APPID/AK/SK
    public static final String APP_ID = "36971505";
    public static final String API_KEY = "Ldp6lRLrNDq0veyeEF5L4NqP";
    public static final String SECRET_KEY = "rwEaC9seSPGIrwqWkUdLKFyTeCdOfgfG";

    // 初始化一个AipImageSearch
    public static final AipImageSearch client = new AipImageSearch(APP_ID, API_KEY, SECRET_KEY);

    //普通版入库示例
    public static JSONObject upload(MultipartFile file) throws IOException {
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
//        options.put("class_id1", "1");
//        options.put("class_id2", "1");
        /*brief是上传图片的信息，需要手动拼接*/
        //获取源文件名
        String filename = file.getOriginalFilename();
        //将源文件格式截取，加上当前时间戳组成新文件名保证不重复
        String name = System.currentTimeMillis() + filename.substring(filename.lastIndexOf("."));
        //将上边的文件名时间戳截取作为文件id
        String id = name.substring(0, name.lastIndexOf("."));
        String brief = "{\"path\":\"" + name + "\", \"id\":\"" + id + "\"}";
        // 参数为二进制数组
        byte[] bytes = file.getBytes();
        JSONObject res = client.productAdd(bytes, brief, options);
        // 商品检索—入库, 图片参数为远程url图片
//        JSONObject res = client.productAddUrl(url, brief, options);
        return res;
    }

    /**
     * oss版上传和百度关联
     *
     * @param file 文件
     * @return
     */
    public static HashMap<String, String> ossUpload(MultipartFile file) {
        //调用上传方法
        String[] strings = baiduUploadFile(file);
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>(2);
//        options.put("class_id1", "1");
//        options.put("class_id2", "1");
        /*brief是上传图片的信息，需要手动拼接*/
        //文件路径strings[0]
        //文件名strings[1]
        String brief = "{\"path\":\"" + strings[0] + "\", \"id\":\"" + strings[1] + "\"}";
        // 商品检索—入库, 图片参数为远程url图片此处为oss文件路径
        JSONObject  jsonObject =  client.productAddUrl(strings[0], brief, options);
        String logId = jsonObject.get("log_id").toString();
        if (StringUtils.isNotBlank(logId)){
            options.put("flag","success");
            options.put("url",strings[0]);
        }else{
            options.put("flag","fail");
        }
        return options;
    }

    /**
     * 上穿文件到oss
     *
     * @param file 文件数据
     * @return String[]
     */
    private static String[] baiduUploadFile(MultipartFile file) {
        // Endpoint以华东1（杭州）为例，其它Region请按实际情况填写。
        //https://oss-cn-beijing.aliyuncs.com
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        String accessKeyId = "LTAI5tDsrQLjfNmPTr7oUimx";
        String accessKeySecret = "QJn7sr0tLwz7jRsJxGNTCBYH5kubgI";
        // 填写Bucket名称，和创建的bucket一致
        String bucketName = "vibang";
        // 填写Object完整路径，完整路径中不能包含Bucket名称，例如exampledir/exampleobject.txt。
        String objectName = "";
        // 填写本地文件的完整路径，例如D:\\localpath\\examplefile.txt。
        // 如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
        //String filePath = "E:\\2212\\pic\\girl.jpg";
        String filename = file.getOriginalFilename();
        //防止文件名出现重复，使用当前时间戳作为当前文件的名，将文件名的原生后缀截取
        objectName = objectName + System.currentTimeMillis() + filename.substring(filename.lastIndexOf("."));
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        String[] resultString = new String[2];
        String fileUrl = "";
        try {
            //获得文件流
            InputStream inputStream = file.getInputStream();
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
            // 上传文件。
            ossClient.putObject(putObjectRequest);
            //得到上传之后的文件地址
            // https://bucketname.endpoint/objectnane
            fileUrl = "https://vibang.oss-cn-beijing.aliyuncs.com/" + objectName;
            System.out.println("上传之后的文件路径" + fileUrl);
            //文件唯一路径
            resultString[0] = fileUrl;
            //文件名
            resultString[1] = objectName;
            return resultString;
        } catch (OSSException | ClientException | IOException oe) {
            throw new RuntimeException(oe);
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }

    public static List<SearchResult> search(String base64String) throws IOException {
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
//        options.put("class_id1", "1");
//        options.put("class_id2", "1");
//        options.put("pn", "100");
//        options.put("rn", "250");
        // 参数为二进制数组
        BASE64Decoder decoder = new BASE64Decoder();

        String file = base64String.substring(base64String.indexOf(",", 1) + 1, base64String.length());
        byte[] bytes = decoder.decodeBuffer(file);
        // 处理数据
        for (int i = 0; i < bytes.length; ++i) {
            if (bytes[i] < 0) {
                bytes[i] += 256;
            }
        }

        JSONObject res = client.productSearch(bytes, options);
        return getListResult(res.toString());

        // 商品检索—检索, 图片参数为远程url图片
//        JSONObject res = client.productSearchUrl(url, options);
//        System.out.println(res.toString(2));

    }
}
